package com.kaoshi.myweb.web.service.common;

import java.io.Serializable;
import java.util.List;

import com.kaoshi.myweb.common.lib.pagehelper.Page;
import com.kaoshi.myweb.common.lib.pagehelper.PageHelper;
import com.kaoshi.myweb.common.lib.pagehelper.PageInfo;
import com.kaoshi.myweb.common.seachable.QueryCondition;
import com.kaoshi.myweb.common.seachable.UpdateCondition;
import com.kaoshi.myweb.web.entity.search.SearchCondition;
import com.kaoshi.myweb.web.repository.core.GenericDao;


/**
 * 增删改查Mapper基类
 * 
 * @author tangx
 * @since 2014年10月22日
 */

public class GenericService<T, ID extends Serializable> {
	
	
	protected GenericDao<T, ID> mapper;
	
//	@Autowired
	public void setMapper(GenericDao<T, ID> mapper) {
		this.mapper = mapper;
	}
	
	/**
	 * 查找所有记录
	 * 
	 * @return 实体列表
	 */
	public List<T> select() {
		return mapper.queryAll();
	}

	/**
	 * 根据主键查找记录
	 * 
	 * @param id
	 * @return 实体对象
	 */
	public T queryById(ID id) {
		 return mapper.queryById(id);
	}

	/**
	 * 根据条件查找记录
	 * 
	 * @param condition
	 *            查询条件
	 * @return 实体列表
	 */
	public List<T> queryByCondition( QueryCondition condition) {
		return mapper.queryByCondition(condition);
	}


	/**
	 * 根据条件查找记录并分页
	 *
	 * @param searchCondition
	 *            查询条件
	 * @return 实体列表
	 */
	public PageInfo<T> queryByPage(SearchCondition searchCondition ) {
		QueryCondition condition = searchCondition.getQueryCondition();
		int pageSize = searchCondition.getPageSize();
		int pageNum = searchCondition.getPageNumber();
		int startRow = pageNum > 0 ? (pageNum - 1) * pageSize : 0;
		int endRow = startRow + pageSize * (pageNum > 0 ? 1 : 0);

		PageHelper.startPage(startRow, endRow);
		List<T> list =  mapper.queryByCondition(condition);
		PageInfo<T> pageInfo = new PageInfo(list);
		return pageInfo;
	}

	/**
	 * 查询记录数
	 * 
	 * @return 记录数
	 */
	public long count() {
		return mapper.count();
	}
	
	/**
	 * 根据条件查询记录数
	 * 
	 * @return 记录数
	 */
	public long countByCondition(QueryCondition condition) {
		return mapper.countByCondition(condition);
	}

	/**
	 * 插入记录
	 * 
	 * @param t
	 *            实体对象
	 * @return 插入影响的记录数
	 */
	public int insert(T t) {
		 mapper.insert(t);
		 return 0;
	}

	/**
	 * 根据主键更新记录
	 * 
	 * @param t
	 *            实体对象
	 * @return 更新影响的记录数
	 */
	public int updateByPrimaryKey(T t) {
		 mapper.updateById(t);
		 return 0;
	}

	/**
	 * 根据条件更新记录
	 * 
	 * @param t
	 *            实体对象
	 * @param condition
	 *            更新条件
	 * @return 更新影响的记录数
	 */
	public int updateByCondition( T t,UpdateCondition condition) {
		return mapper.updateByCondition(t, condition);
	}

	/**
	 * 根据主键删除记录
	 * 
	 * @param id
	 *            主键值
	 * @return 删除影响的记录数
	 */
	public boolean deleteByPrimaryKey(ID id) {
		return mapper.deleteById(id);
	}

	/**
	 * 根据条件删除记录
	 * 
	 * @param condition
	 *            删除条件
	 * @return 删除影响的记录数
	 */
	public int deleteByCondition(UpdateCondition condition) {
		return mapper.deleteByCondition(condition);
	}
}
